リソースレベルのRDSコストをAWS CLIから確認する【Cost Explorer】

リソースレベルのRDSコストをAWS CLIから確認する【Cost Explorer】

Clock Icon2024.11.13

現在、いちプロジェクトにてRDSのコスト最適化を推進しています。 コスト可視化のための1ツールとして Cost Explorer を活用しています。

Cost Explorer を使うとAWSコストの遷移を調査できます。 使用タイプやデータベースエンジンなどでグループ化/フィルタが可能です。 またオプトインの機能として、リソースごとのグループ化/フィルタもできます。

本ブログでは リソースレベルのRDSコストを AWS CLI から確認 してみます。 今後、機械的にレポートを作成することを見越しています。

前提

Cost Explorer のリソースレベル可視化はオプトインが必要です。

sc_2024-11-13_08-27-32_1584
画像引用: AWS Cost Explorer【AWS Black Belt】 - YouTube

また、リソースレベルのデータは 過去14日間のみのサポートです。 それよりも遡って確認したい場合は Cost and Usage Reports(CUR) の利用を検討ください。

RDSリソースごとにグループ化したコストを確認する

まずはRDSリソースでグループ化したコストを AWS CLI から出力してみます。

Cost Explorer(ce)の get-cost-and-usage-with-resources コマンドを使います。 リソースごとにグループ化するには group-by パラメータに Type=DIMENSION,Key=RESOURCE_ID を指定します。

以下、1週間前(1日分)のRDSコストをリソース別で取得するコマンド例です。

### 取得する日付の設定
# ※ macOS の date コマンドの場合は date -v-7d +%Y-%m-%d みたいに書く
date_start=$(date '+%Y-%m-%d' --date '7 days ago')
date_end=$(date '+%Y-%m-%d' --date '6 days ago')

### フィルターの設定
ce_filter=$(cat <<EOF
{
  "Dimensions": {
    "Key": "SERVICE",
    "Values": ["Amazon Relational Database Service"],
    "MatchOptions": ["EQUALS"]
  }
}
EOF
)

### RDSリソース別のコスト情報を取得する
# ※特に割引やRI購入がない場合、 metrics は UnblendedCost(非ブレンドコスト) でOK
aws ce get-cost-and-usage-with-resources --output yaml \
  --time-period Start="${date_start}",End="${date_end}" \
  --granularity DAILY \
  --metrics NetAmortizedCost \
  --group-by Type=DIMENSION,Key=RESOURCE_ID \
  --filter "${ce_filter}"
出力サンプル
DimensionValueAttributes: []
GroupDefinitions:
- Key: RESOURCE_ID
  Type: DIMENSION
ResultsByTime:
- Estimated: true
  Groups:
  - Keys:
    - NoResourceId
    Metrics:
      NetAmortizedCost:
        Amount: '16.1234123412'
        Unit: USD
  - Keys:
    - arn:aws:rds:ap-northeast-1:111111111111:db:example-db1
    Metrics:
      NetAmortizedCost:
        Amount: '0.6123123412'
        Unit: USD
  - Keys:
    - arn:aws:rds:ap-northeast-1:111111111111:cluster-snapshot:example-cluster1
    Metrics:
      NetAmortizedCost:
        Amount: '0.7237904232'
        Unit: USD
  # ーー略ーー
  - Keys:
    - arn:aws:rds:ap-northeast-1:111111111111:db:example-dbn
    Metrics:
      NetAmortizedCost:
        Amount: '4.8534123412'
        Unit: USD
  TimePeriod:
    End: '2024-11-07T00:00:00Z'
    Start: '2024-11-06T00:00:00Z'
  Total: {}

これはマネジメントコンソールの以下画面の結果と同じです。

sc_2024-11-13_07-29-44_16831

もう少し整形して、見やすくしてみます。 以下、上位10リソースを tsv として出力するサンプルスクリプトです。

### 取得する日付の設定
# ※ macOS の date コマンドの場合は date -v-7d +%Y-%m-%d みたいに書く
date_start=$(date '+%Y-%m-%d' --date '7 days ago')
date_end=$(date '+%Y-%m-%d' --date '6 days ago')

### フィルターの設定
ce_filter=$(cat <<EOF
{
  "Dimensions": {
    "Key": "SERVICE",
    "Values": ["Amazon Relational Database Service"],
    "MatchOptions": ["EQUALS"]
  }
}
EOF
)

### クエリの設定
ce_query=$(cat <<EOF
ResultsByTime[0].Groups[].[
  Keys[0],
  Metrics.NetAmortizedCost.Amount,
  Metrics.NetAmortizedCost.Unit
]
EOF
)

### RDSリソース別のコスト情報を取得して、上位10リソースを tsv として出力する
# ※特に割引やRI購入がない場合、 metrics は UnblendedCost(非ブレンドコスト) でOK
echo "Key\tAmount\tUnit"
aws ce get-cost-and-usage-with-resources --output text \
  --time-period Start="${date_start}",End="${date_end}" \
  --granularity DAILY \
  --metrics NetAmortizedCost \
  --group-by Type=DIMENSION,Key=RESOURCE_ID \
  --filter "${ce_filter}" \
  --query "${ce_query}" \
| sort -k 2 -nr \
| head -n 10
出力サンプル
Key Amount  Unit
arn:aws:rds:ap-northeast-1:111111111111:db:example-db1  33.3091116083   USD
arn:aws:rds:ap-northeast-1:111111111111:cluster:example-cluster1    32.3128333333   USD
arn:aws:rds:ap-northeast-1:111111111111:cluster:example-cluster2    29.1794444407   USD
NoResourceId    14.0240000702   USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db3  9.3360444441    USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db4  9.3360000006    USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db5  5.9113333456    USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db6  4.8522222274    USD
arn:aws:rds:ap-northeast-1:111111111111:db:example-db7  4.2522222812    USD
arn:aws:rds:ap-northeast-1:111111111111:cluster-snapshot:example-snapshot   1.555500008 USD

特定リソースのコスト内訳(使用タイプ)を確認する

次は、「あるRDSリソースに掛かっているコスト」を 使用タイプごとにグループ化して出力してみます。

同じく get-cost-and-usage-with-resources コマンドを使います。 filter パラメータに RESOURCE_ID を指定して、 その値に「対象RDSリソースのARN」を記載します。

そして、group-by パラメータには Type=DIMENSION,Key=USAGE_TYPE を指定します。

### 取得するリソースのARNを設定
resource_arn="arn:aws:rds:ap-northeast-1:111111111111:db:example-db1"

### 取得する日付の設定
# ※ macOS の date コマンドの場合は date -v-7d +%Y-%m-%d みたいに書く
date_start=$(date '+%Y-%m-%d' --date '7 days ago')
date_end=$(date '+%Y-%m-%d' --date '6 days ago')

### フィルターの設定
ce_filter=$(cat <<EOF
{
  "Dimensions": {
    "Key": "RESOURCE_ID",
    "Values": ["${resource_arn}"],
    "MatchOptions": ["EQUALS"]
  }
}
EOF
)

### 特定リソースの使用タイプごとのコスト情報を取得する
# ※特に割引やRI購入がない場合、 metrics は UnblendedCost(非ブレンドコスト) でOK
aws ce get-cost-and-usage-with-resources --output yaml \
  --time-period Start="${date_start}",End="${date_end}" \
  --granularity DAILY \
  --metrics NetAmortizedCost \
  --group-by Type=DIMENSION,Key=USAGE_TYPE \
  --filter "${ce_filter}"
出力サンプル
DimensionValueAttributes: []
GroupDefinitions:
- Key: USAGE_TYPE
  Type: DIMENSION
ResultsByTime:
- Estimated: true
  Groups:
  - Keys:
    - APN1-DataTransfer-In-Bytes
    Metrics:
      NetAmortizedCost:
        Amount: '0'
        Unit: USD
  - Keys:
    - APN1-DataTransfer-Out-Bytes
    Metrics:
      NetAmortizedCost:
        Amount: '0.00000373333'
        Unit: USD
  - Keys:
    - APN1-InstanceUsage:db.t3.medium
    Metrics:
      NetAmortizedCost:
        Amount: '1.810222222'
        Unit: USD
  - Keys:
    - APN1-RDS:ChargedBackupUsage
    Metrics:
      NetAmortizedCost:
        Amount: '0.6583333861'
        Unit: USD
  - Keys:
    - APN1-RDS:GP2-Storage
    Metrics:
      NetAmortizedCost:
        Amount: '0.9199999992'
        Unit: USD
  - Keys:
    - APN1-RDS:ProxyUsage
    Metrics:
      NetAmortizedCost:
        Amount: '0.864'
        Unit: USD
  TimePeriod:
    End: '2024-11-07T00:00:00Z'
    Start: '2024-11-06T00:00:00Z'
  Total: {}

これはマネジメントコンソールの以下画面の結果と同じです。

sc_2024-11-13_09-03-38_4193

こちらについても、上位の使用タイプを tsv として出力するサンプルスクリプトを 作成してみます。

### 取得するリソースのARNを設定
resource_arn="arn:aws:rds:ap-northeast-1:111111111111:db:example-db1"

### 取得する日付を設定
# ※ macOS の date コマンドの場合は date -v-7d +%Y-%m-%d みたいに書く
date_start=$(date '+%Y-%m-%d' --date '7 days ago')
date_end=$(date '+%Y-%m-%d' --date '6 days ago')

### フィルターの設定
ce_filter=$(cat <<EOF
{
  "Dimensions": {
    "Key": "RESOURCE_ID",
    "Values": ["${resource_arn}"],
    "MatchOptions": ["EQUALS"]
  }
}
EOF
)

### クエリの設定
ce_query=$(cat <<EOF
ResultsByTime[0].Groups[].[
  Keys[0],
  Metrics.NetAmortizedCost.Amount,
  Metrics.NetAmortizedCost.Unit
]
EOF
)

### 特定リソースの使用タイプごとのコスト情報を取得して、上位10リソースを tsv として出力する
# ※特に割引やRI購入がない場合、 metrics は UnblendedCost(非ブレンドコスト) でOK
echo "Key\tAmount\tUnit"
aws ce get-cost-and-usage-with-resources --output text \
  --time-period Start="${date_start}",End="${date_end}" \
  --granularity DAILY \
  --metrics NetAmortizedCost \
  --group-by Type=DIMENSION,Key=USAGE_TYPE \
  --filter "${ce_filter}" \
  --query "${ce_query}" \
| sort -k 2 -nr \
| head -n 10
出力サンプル
Key Amount  Unit
APN1-InstanceUsage:db.t3.medium 1.81000006  USD
APN1-RDS:GP2-Storage    0.9199999992    USD
APN1-RDS:ProxyUsage 0.748   USD
APN1-RDS:ChargedBackupUsage 0.658444461 USD
APN1-DataTransfer-Out-Bytes 0.000003449 USD
APN1-DataTransfer-In-Bytes  0   USD

おわりに

リソースレベルのRDSコストを AWS CLI の Cost Explorer(ce) コマンドで確認してみました。

基本的にはマネジメントコンソールにて Cost Explorer を見るのが便利です。 繰り返し確認して共有するような項目がある場合は、 今回みたいに AWS CLI を活用して機械的に取得してみると良いかもしれません。

以上、参考になれば幸いです。

参考

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ce/get-cost-and-usage-with-resources.html

https://www.youtube.com/watch?v=poZiRvLYkoo

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.